const Koa = require("koa");
const Router = require("koa-router");
const multer = require("@koa/multer");
const {koaBody} = require("koa-body");
const fs = require("fs");
const path = require("path");
const cors = require("@koa/cors");

const app = new Koa();
const router = new Router();

// 配置存储路径
const uploadDir = path.join(__dirname, "uploads");
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir);
}

// 接收文件块
router.post("/upload-chunk", async (ctx) => {
  const { fileName, chunkIndex } = ctx.request.body;
  const file = ctx.request.files.file;

  // 保存文件块
  // 创建临时文件
  const chunkPath = path.join(uploadDir, `${fileName}.part${chunkIndex}`);
  // 根据file路径创建了读的流式对象
  const reader = fs.createReadStream(file.filepath);
  // 根据chunkPath创建了写流
  const writer = fs.createWriteStream(chunkPath);
  // 建立一个通道，将reader流写入writer流
  reader.pipe(writer);

  // createReadStream和createWriteStream都是nodejs的流式对象，而且都是异步的
  // 相当于流与流之间的写入和读取是通过pipe来完成的
  ctx.body = { message: "Chunk uploaded successfully" };
});

// 合并文件块
router.post("/merge-file", async (ctx) => {
  const { fileName, totalChunks } = ctx.request.body;

  // 创建了最终文件的地址
  const filePath = path.join(uploadDir, fileName);
  // 根据最终文件的地址创建了一个写流
  const writer = fs.createWriteStream(filePath);

  for (let i = 0; i < totalChunks; i++) {
    // 创建一个一个的分文件的路径
    const chunkPath = path.join(uploadDir, `${fileName}.part${i}`);
    // 同步读取分文件，读取到的是二进制数据
    const chunkData = fs.readFileSync(chunkPath);
    // 通过写流将二进制数据写入最终文件
    writer.write(chunkData);
    // 同步删除之前的分文件
    fs.unlinkSync(chunkPath); // 删除临时块文件
  }

  writer.end();
  ctx.body = { message: "File merged successfully" };
});

app.use(cors());
app.use(koaBody({ multipart: true }));
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000, () => {
  console.log("Server running on http://localhost:3000");
});

/* 之前的关于文件的传输的写法，这种的是直接写的文件，没有通过formData的形式来包裹完成的

// 上传文件存放路径、及文件命名
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // 这里说明req.user.email是可以用的
    const email = req.user.email;

    const articleId = req.body.articleId;

    const articleDir = path.join(
      __dirname,
      "../../../public/author",
      email,
      "articles",
      articleId?.toString()
    );
    console.log("path at storage", articleDir);
    cb(null, articleDir);
  },
  filename: function (req, file, cb) {
    cb(null, `${Date.now()}-${file.originalname}`); // 文件名加上时间戳
  },
});
//文件上传限制
const limits = {
  fields: 10, //非文件字段的数量
  fileSize: 10 * 1024 * 1024, //文件大小 单位 10MB
  files: 1, //文件数量
};
const upload = multer({ storage, limits });

// 用户上传文章的图片
router.post(
  "/uplaodArticleImg",
  verifyToken,
  upload.single("file"),
  async (ctx, next) => {
    // 在这里就没有做过多的判断了，比如判断文件是否上传成功
    // 获取作者的email
    const email = ctx.state.user.email;
    // 获取文章id
    const { articleId } = ctx.request.body;

    // 获取上传的文件
    const file = ctx.file;

    // 响应
    ctx.status = 200;
    ctx.body = {
      code: 200,
      data: {
        url: `http://${KoaConfig.host}:3000/author/${email}/articles/${articleId}/${file.filename}`,
        alt: "图片描述文字",
        href: "图片的链接",
      },
    };
  }
);

*/